package com.fanco.learn_datastruct_leetcode.designpattern.interpreter;

import java.util.HashMap;
import java.util.Stack;

public class Calculator {

	// ������ʽ
	private Expression expression;

	// ���캯�����Σ�������
	public Calculator(String expStr) { // expStr = a+b
		//
		Stack<Expression> stack = new Stack<>();
		// 表达式拆分成数组
		char[] charArray = expStr.toCharArray();// [a, +, b]

		Expression left = null;
		Expression right = null;
		// 遍历我们的字符数组，就是遍历【a, + , b】
		// 针对不同的情况，做处理
		for (int i = 0; i < charArray.length; i++) {
			switch (charArray[i]) {
			case '+': //
				left = stack.pop();// 从stack取出 left --> a
				right = new VarExpression(String.valueOf(charArray[++i]));// 取出右表达式 "b"
				stack.push(new AddExpression(left, right));// 然后根据得到的 left 和 right 构建AddExpress 加入 Stack
				break;
			case '-': //
				left = stack.pop();
				right = new VarExpression(String.valueOf(charArray[++i]));
				stack.push(new SubExpression(left, right));
				break;
			default:
				// 如果是一个 var, 就创建一个 varExpression对象，并push stack
				stack.push(new VarExpression(String.valueOf(charArray[i])));
				break;
			}
		}
		// 当遍历完整charArray数组后， stack得到最后的experessionm
		this.expression = stack.pop();
	}

	public int run(HashMap<String, Integer> var) {
		// 最后将表达式 和 var 绑定
		return this.expression.interpreter(var);
	}
}
